package com.atguigu.gmall.mq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

@Configuration
public class DeadLetterMqConfig {

    // 创建固定的exchange routingkey 以及queue名称成员变量
    public static final String exchange_dead = "exchange.dead";
    public static final String routing_dead_1 = "routing.dead.1";
    public static final String routing_dead_2 = "routing.dead.2";
    public static final String queue_dead_1 = "queue.dead.1";
    public static final String queue_dead_2 = "queue.dead.2";

    /**
     * 实现延迟队列的交换机是固定的，其实就是利用了消息的过期时间来实现的延迟队列
     * 交换机使用的是一个交换机
     */
    /**
     * 定义交换机
     * @return
     */
    @Bean
    public Exchange createExchange(){
        return new DirectExchange(exchange_dead,true,false);
    }

    /**
     * 创建queue
     * @return
     */
    @Bean
    public Queue createQueue(){
        HashMap<String, Object> map = new HashMap<>();
        // 设置为延迟队列所绑定的交换机
        map.put("x-dead-letter-exchange",exchange_dead);
        // 设置如果消息过去将加入到对应队列的路由key
        map.put("x-dead-letter-routing-key",routing_dead_2);
        // 设置消息的过期时间
        map.put("x-message-ttl",10*1000);
        Queue queue = new Queue(queue_dead_1,true,false,false,map);
        return queue;
    }

    /**
     * 交换机进行绑定
     * @return
     */
    @Bean
    public Binding binding(){
        return BindingBuilder.bind(createQueue()).to(createExchange()).with(routing_dead_1).noargs();
    }

    // 创建死信队列 ,其实就是普通的队列
    @Bean
    public Queue queue(){
        return new Queue(queue_dead_2,true,false,false,null);
    }

    // 设置队列二的绑定规则
    @Bean
    public Binding binding2(){
        // 将队列二通过routing_dead_2 key 绑定到exchange_dead交换机上！
        return BindingBuilder.bind(queue()).to(createExchange()).with(routing_dead_2).noargs();
    }


}
